iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 7
1
Security

資訊系統安全與 CISSP 的簡單應用系列 第 7

[Day 07] 安全工程 (Cryptography for Confidentiality)

  • 分享至 

  • xImage
  •  

前幾天的主題有點像是文法商學?沒關係,喜歡工程學的您,接下來幾天就是各位的主場了。先來一場「簡單加密演算法見面會」,請問,若是您已經識別出某一資料的分類等級為「非公開 (Non-public)」,為防曝露竊取的風險,您會採取哪種加密演算法?

(停頓 3 分鐘,讓大家有時間思考一下)

... 1 min
... 2 mins
... 3 mins

(好,時間到,下方高能預警,請小心服用)

使用 AES 演算法為檔案加解密


首先,資料加密標準 (Data Encryption Standard,DES) 已被 證實 不是一種安全的加密方法,所以我們這裡推薦使用「進階加密標準 (Advanced Encryption Standard,AES)」喔。(直接來點刺激的給大家~~)

直接使用 System.Security.Cryptography 中的 AES 算法給各位示範加解密 (還記得安總是 .NET 工程師吧 @@?)

/// <summary>
/// 字串加密
/// </summary>
/// <param name="Source">加密前字串</param>
/// <param name="CryptoKey">加密金鑰</param>
/// <returns>加密後字串</returns>
public static string aesEncryptBase64(string Source, string CryptoKey)
{
    string encrypt = "";
    try
    {
        AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
        SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider();
        byte[] key = sha256.ComputeHash(Encoding.UTF8.GetBytes(CryptoKey));
        byte[] iv = md5.ComputeHash(Encoding.UTF8.GetBytes(CryptoKey));
        aes.Key = key;
        aes.IV = iv;

        byte[] dataByteArray = Encoding.UTF8.GetBytes(Source);
        using (MemoryStream ms = new MemoryStream())
        using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
        {
            cs.Write(dataByteArray, 0, dataByteArray.Length);
            cs.FlushFinalBlock();
            encrypt = Convert.ToBase64String(ms.ToArray());
        }
    }
    catch (Exception e)
    {
        System.Windows.Forms.MessageBox.Show(e.Message);
    }
    return encrypt;
}

接下來是解密的部分,有加密就有解密,循環相剋,生生不息...

/// <summary>
/// 字串解密
/// </summary>
/// <param name="Source">解密前字串</param>
/// <param name="CryptoKey">解密金鑰</param>
/// <returns>解密後字串</returns>
public static string aesDecryptBase64(string Source, string CryptoKey)
{
    string decrypt = "";
    try
    {
        AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
        SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider();
        byte[] key = sha256.ComputeHash(Encoding.UTF8.GetBytes(CryptoKey));
        byte[] iv = md5.ComputeHash(Encoding.UTF8.GetBytes(CryptoKey));
        aes.Key = key;
        aes.IV = iv;

        byte[] dataByteArray = Convert.FromBase64String(Source);
        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write))
            {
                cs.Write(dataByteArray, 0, dataByteArray.Length);
                cs.FlushFinalBlock();
                decrypt = Encoding.UTF8.GetString(ms.ToArray());
            }
        }
    }
    catch (Exception e)
    { 
        System.Windows.Forms.MessageBox.Show(e.Message);
    }
    return decrypt;
}

上面的 CODE 我親自 Build 過是成功的,套句 Knuth 說的話,"I only proved it correct, but I didn't try it." 很顯然安總不僅證明它是對的,也試過了。

上面這段 CODE 寫得好的地方在於,它很容易懂,而且會說話,更重要的是,它把 CryptoKey 包出來作為參數,形成可共用的元件 (我們最喜歡多參數了!!)

FIPS 標準與 CMVP 驗證


您的加密模組符合 FIPS 標準與 CMVP 驗證嗎?上述用例之精妙在於,AesCryptoServiceProvider 類別已符合 FIPS 標準,它也已通過 NIST 之 CMVP 驗證。以下簡單介紹一下專有名詞:

  • CMVP = Cryptographic Module Validation Program
  • NIST = 美國國家標準技術研究所
  • FIPS = 聯邦資訊處理標準 (Federal Information Processing Standards),是美國聯邦政府制定給,所有軍事機構除外的政府機構及政府的承包商,所使用的公開標準。

這兩天文章,安總花了很多心思構想,到底怎樣的安排是最實用的?同時又能夠兼顧科學嚴謹度?且聽說書人娓娓道來..


之前聽到他的故事,深受感動,書中最多出現的詞是「孤獨」,在升學的標準體制下,參加資奧、奪得金牌,申請 MIT 入學何等不容易?一路走來又何等孤寂?吾人敬佩,願傾囊贊助之。
我的未來,自己寫
《我的未來,自己寫:17 歲資奧金牌少年,衝撞體制 500 天》


上一篇
[Day 06] 資產安全 (Security of Assets)
下一篇
[Day 08] 安全工程 (Cryptography for Authentication)
系列文
資訊系統安全與 CISSP 的簡單應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言